package com.hjs.test.test;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.StringWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author hongjs
 * @version 1.0.0
 * @date 2025年10月14日 16:08
 * @description 类描述
 */
public class XmlHelper {

    public static String getVoucherXml(){
        // 1. 创建根 Document
        Document document = DocumentHelper.createDocument();

        // 2. 创建根节点 <ufinterface> 并设置属性
        Element ufinterface = document.addElement("ufinterface")
                .addAttribute("proc", "add")
                .addAttribute("roottag", "")
                .addAttribute("billtype", "vouchergl")
                .addAttribute("businessunitcode", "develop")
                .addAttribute("replace", "")
                .addAttribute("groupcode", "1")
                .addAttribute("sender", "OutSystem")
                .addAttribute("isexchange", "")
                .addAttribute("docid", "")
                .addAttribute("receiver", "0001121000000000JIYO")
                .addAttribute("orgcode", "");

        // 3. 创建 <voucher>
        Element voucher = ufinterface.addElement("voucher").addAttribute("id",getCurrentDateTimeString());

        // 4. 创建 <voucher_head>
        Element voucherHead = voucher.addElement("voucher_head");

        // 5. 添加 <voucher_head> 的各个字段（包括空标签）
        addElement(voucherHead, "pk_vouchertype", "记账凭证");
        addElement(voucherHead, "year", "2025");
        addElement(voucherHead, "pk_system", "DCPP");
        addElement(voucherHead, "voucherkind", "0");
        addElement(voucherHead, "pk_accountingbook", "012503-0003");
        addElement(voucherHead, "discardflag", ""); // 空标签内容，生成 <discardflag></discardflag>
        addElement(voucherHead, "period", "09");
        addElement(voucherHead, "no", ""); // 空标签内容，生成 <no></no>
        addElement(voucherHead, "attachment", ""); // 空标签内容，生成 <attachment></attachment>
        addElement(voucherHead, "prepareddate", "2025-09-25 16:16:00");
        addElement(voucherHead, "pk_prepared", "管理员1");
        addElement(voucherHead, "pk_casher", ""); // 空标签内容，生成 <pk_casher></pk_casher>
        addElement(voucherHead, "pk_checked", ""); // 空标签内容，生成 <pk_checked></pk_checked>
        addElement(voucherHead, "tallydate", ""); // 空标签内容，生成 <tallydate></tallydate>
        addElement(voucherHead, "pk_manager", ""); // 空标签内容，生成 <pk_manager></pk_manager>
        addElement(voucherHead, "memo1", ""); // 空标签内容，生成 <memo1></memo1>
        addElement(voucherHead, "memo2", ""); // 空标签内容，生成 <memo2></memo2>
        addElement(voucherHead, "siscardflag", ""); // 空标签内容，生成 <siscardflag></siscardflag>
        addElement(voucherHead, "pk_org", "012503");
        addElement(voucherHead, "pk_org_v", ""); // 空标签内容，生成 <pk_org_v></pk_org_v>
        addElement(voucherHead, "pk_group", "1");

        // 6. 创建 <details>
        Element details = voucherHead.addElement("details");

        // 7. 添加第一个 <item>
        Element item1 = details.addElement("item");
        addElement(item1, "detailindex", "1");
        addElement(item1, "explanation", "test2扫码券领用-发售");
        addElement(item1, "verifydate", ""); // 空标签
        addElement(item1, "price", ""); // 空标签
        addElement(item1, "excrate2", ""); // 空标签
        addElement(item1, "debitquantity", ""); // 空标签
        addElement(item1, "debitamount", "600");
        addElement(item1, "localdebitamount", "600");
        addElement(item1, "groupdebitamount", ""); // 空标签
        addElement(item1, "globaldebitamount", ""); // 空标签
        addElement(item1, "pk_currtype", "CNY");
        addElement(item1, "pk_accasoa", "22411802");
        addElement(item1, "pk_unit", ""); // 空标签
        addElement(item1, "pk_unit_v", ""); // 空标签
        addElement(item1, "vatdetail", ""); // 空标签
        // 添加 <ass>
        Element ass1 = addElement(item1, "ass", ""); // 父元素 <ass>
        addElement(ass1, "item", ""); // 父元素 <item>
        addElement(ass1.element("item"), "pk_Checktype", "0001");
        addElement(ass1.element("item"), "pk_Checkvalue", "e020201");
        // 添加其他空标签
        addElement(item1, "cashFlow", ""); // 空标签
        addElement(item1, "detail", ""); // 空标签
        addElement(item1, "free1", ""); // 空标签

        // 8. 添加第二个 <item>
        Element item2 = details.addElement("item");
        addElement(item2, "detailindex", "2");
        addElement(item2, "explanation", "test2扫码券领用-领取");
        addElement(item2, "verifydate", ""); // 空标签
        addElement(item2, "price", ""); // 空标签
        addElement(item2, "excrate2", ""); // 空标签
        addElement(item2, "creditquantity", ""); // 空标签
        addElement(item2, "creditamount", "600");
        addElement(item2, "localcreditamount", "600");
        addElement(item2, "groupcreditamount", ""); // 空标签
        addElement(item2, "globalcreditamount", ""); // 空标签
        addElement(item2, "pk_currtype", "CNY");
        addElement(item2, "pk_accasoa", "22411801");
        addElement(item2, "pk_unit", ""); // 空标签
        addElement(item2, "pk_unit_v", ""); // 空标签
        addElement(item2, "vatdetail", ""); // 空标签
        // 添加 <ass>
        Element ass2 = addElement(item2, "ass", ""); // 父元素 <ass>
        addElement(ass2, "item", ""); // 父元素 <item>
        addElement(ass2.element("item"), "pk_Checktype", "0001");
        addElement(ass2.element("item"), "pk_Checkvalue", "e020201");
        // 添加其他空标签
        addElement(item2, "cashFlow", ""); // 空标签
        addElement(item2, "detail", ""); // 空标签
        addElement(item2, "free1", ""); // 空标签


        return documentToFormattedString(document);
    }

    public static String getCurrentDateTimeString(){
        // 1. 获取当前时间（年月日时分秒毫秒）
        LocalDateTime now = LocalDateTime.now();
        // 2. 定义格式：yyyyMMddHHmmssSSS（无分隔符，包含毫秒）
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
        // 3. 格式化当前时间为字符串
        return now.format(formatter);
    }
    /**
     * 向父元素添加一个子元素，并设置其文本内容。
     * 如果 text 为 null 或空字符串，则生成空标签（如 <tag></tag>）。
     *
     * @param parent   父元素
     * @param elementName 子元素名称
     * @param text     子元素文本内容
     * @return 新添加的子元素（Element），便于链式调用或进一步操作
     */
    private static Element addElement(Element parent, String elementName, String text) {
        Element element = parent.addElement(elementName);
        if (text != null && !text.trim().isEmpty()) {
            element.addText(text);
        }
        // 如果 text 为 null 或空字符串，element 仍被添加，但内容为空（如 <tag></tag>）
        return element;
    }

    /**
     * 将 DOM4J 的 Document 转成格式化的 XML 字符串（带缩进换行）
     */
    public static String documentToFormattedString(Document document) {
        try {
            OutputFormat format = OutputFormat.createPrettyPrint(); // 美化格式
            StringWriter stringWriter = new StringWriter();
            XMLWriter writer = new XMLWriter(stringWriter, format);
            writer.write(document);
            writer.close();
            return stringWriter.toString();
        } catch (Exception e) {
            throw new RuntimeException("XML 格式化失败", e);
        }
    }
}
